// 导入 express 模块
const express = require('express')
const path = require('path')
const cors = require('cors')
const joi = require('joi')

// add for test

// 解析 token， 得到token里面加密信息
const expressJwt = require('express-jwt')

const config = require('./config')

const userRouter = require('./router/user')
const userinfoRouter = require('./router/userinfo')

const articleCatRouter = require('./router/article_cate')

const articleRouter = require('./router/article')

// 创建 express 的服务器实例
const app = express()

// 可以支持跨域请求
app.use(cors())

// 支持 表单的数据解析
app.use(express.urlencoded({ extended: false }))

app.use('/uploads', express.static(path.join(__dirname, 'uploads')))


app.use(function(req, res, next) {
    // 定义一个 res上面的函数， 用来处理错误
    res.cc = function(err, status = 1) {
        res.send({
            status,
            // 状态描述，判断 err 是 错误对象 还是 字符串
            message: err instanceof Error ? err.message : err,
        })
    }
    next()
})

// 对 token 进行解析和限制, 但是 api开始的请求就直接放行
app.use(expressJwt({ secret: config.jwtKey }).unless({ path: [/^\/api\//] }))

// write your code here...
// 让路由生效
app.use('/api', userRouter)
app.use('/my', userinfoRouter)

app.use('/my/article', articleCatRouter)

app.use('/my/article', articleRouter)

// 错误级别的中间件的位置
app.use(function(err, req, res, next) {
    if (err instanceof joi.ValidationError) {
        // 数据验证错误
        res.cc(err)
    } else if (err.name === 'UnauthorizedError') {
        res.cc(` token 认证失败： ${err.message}`, 4)
    } else {
        // 其他错误
        res.cc(err)
    }
    next()
})

// 调用 app.listen 方法，指定端口号并启动web服务器
app.listen(3007, function() {
    console.log('api server running at http://127.0.0.1:3007')
})
